﻿using System;

namespace DevExpress.CrmDemo.Win.Helpers
{
    public static class DateTimeExtensions
    {
        public static string GetRelativeTimeString(this TimeSpan ts)
        {
            double delta = Math.Abs(ts.TotalSeconds);
            
            const int SECOND = 1;
            const int MINUTE = 60 * SECOND;
            const int HOUR = 60 * MINUTE;
            const int DAY = 24 * HOUR;
            const int MONTH = 30 * DAY;

            if (delta < 0)
            {
                return "not yet";
            }
            if (delta < 1 * MINUTE)
            {
                return ts.Seconds == 1 ? "one second ago" : ts.Seconds + " seconds ago";
            }
            if (delta < 2 * MINUTE)
            {
                return "a minute ago";
            }
            if (delta < 45 * MINUTE)
            {
                return ts.Minutes + " minutes ago";
            }
            if (delta < 90 * MINUTE)
            {
                return "an hour ago";
            }
            if (delta < 24 * HOUR)
            {
                return ts.Hours + " hours ago";
            }
            if (delta < 48 * HOUR)
            {
                return "yesterday";
            }
            if (delta < 30 * DAY)
            {
                return ts.Days + " days ago";
            }
            if (delta < 12 * MONTH)
            {
                int months = Convert.ToInt32(Math.Floor((double)ts.Days / 30));
                return months <= 1 ? "one month ago" : months + " months ago";
            }
            else
            {
                int years = Convert.ToInt32(Math.Floor((double)ts.Days / 365));
                return years <= 1 ? "one year ago" : years + " years ago";
            }
        }

        public static int ToFiscalYear(this DateTime date)
        {
            DateTime fyStart = new DateTime(date.Year, 10, 1);

            return date >= fyStart ? date.Year + 1 : date.Year;
        }

        public static string GetDateRangeString(this DateTime date1, DateTime date2)
        {
            DateTime startDate;
            DateTime endDate;

            date1 = date1.Date;
            date2 = date2.Date;

            bool switchOrder = date2 < date1;

            startDate = switchOrder ? date2 : date1;
            endDate = switchOrder ? date1 : date2;              
            
            // years are different
            if (startDate.Year != endDate.Year)
                return startDate.ToString("MMMM yyyy") + " - " + endDate.ToString("MMMM yyyy");

            // same year but different months
            if (startDate.Month != endDate.Month)
                return startDate.ToString("MMMM") + " - " + endDate.ToString("MMMM yyyy");

            // same year and month, but different days
            if (startDate.Day != endDate.Day)
                return startDate.ToString("MMMM d - ") + endDate.ToString("d, yyyy");

            // same year, month, day
            return startDate.ToString("MMMM d, yyyy");
        }
    }
}
